package utils;

import entity.User;
import io.jsonwebtoken.*;

import java.util.Date;

/**
 * @author: HKY
 * @date: 2022年11月23日 8:31
 * @ClassName: TokenUtil
 * @Description: 生成和验证Token工具类
 */
public class TokenUtil {
    //设置有效时间是7天1000 * 60 * 60 * 24 * 7
    private static long time =1000 * 60 * 60 * 2;
    //salt，一段加密的字符，这一串东西不能给别人知道不然就不安全了，只有设计者知道
    private static String signature="HeKaiYang";

    /**
     * 创建Token的方法，参数是一个结果集,传入的参数是要携带的数据对象
     * @param user
     * @return
     */
    public static String createToken(User user){
        //创建JWT对象
        JwtBuilder jwtBuilder= Jwts.builder();

        String jwtToken = jwtBuilder
                //设置头信息，typ是头类型，alg是编码算法！
                //Header
                .setHeaderParam("typ","JWT")
                .setHeaderParam("alg","HS256")
                //payload,载荷，也就是存数据的部分
                .claim("res",user)
                //加一个主题，也就是前端获取到的数据名称
                .setSubject("admin")
                //设置有效期
                .setExpiration(new Date(System.currentTimeMillis()+time))
                .setId(user.getUserId().toString())
                //Signature 设置标签（签名）识别的方式，解密算法和salt
                .signWith(SignatureAlgorithm.HS256,signature)
                //拼接Header、payload和Signature成一个完整的Token
                .compact();
        return jwtToken;
    }

    /**
     * 判断某些拦截的页面是否携带有token
     * @param token
     * @return
     */
    public static boolean  parseToken(String token){
        if (token==null){
            return false;
        }
        //获得一个jwtParse对象用来解密,通过程序员设置的salt和token解密如果能够解密就证明是正确的token，否则报出异常
        try{
            Jws<Claims> claimsJwt = Jwts.parser().setSigningKey(signature).parseClaimsJws(token);
        }
        catch (Exception e){
            return false;
        }
        return true;
    }
}
